package haggisworld;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Andreas Miksik
 */
public class SpielClient {

    String clientName = "c";
    int clientNummer;
    int aktuellerSpieler;
    Socket socket;
    ObjectOutputStream output;
    ObjectInputStream input;
    SpielerFenster fenster = null;

    public static void main(String[] args) {
        System.out.println("Main SpielClient - ClientNummer: " + SpielServerThread.clientNummer);
        SpielClient spielClient = new SpielClient();
    }

    /**
     * Diese Klasse weist jedem Client eine ClientNummer zu.
     *
     * @param clientNummer Nummer des Clients 1...2
     */
    private void setClientName(int clientNummer) {
        this.clientNummer = clientNummer;
        this.clientName = "c" + clientNummer;
    }

    /**
     * Die Methode empfange() empfängt Objekte der Klasse SpielObjekt über den
     * ObjectInputStream. Diese Objekte werden von der Klasse SpielServerThread
     * an die Klasse SpielClient übermittelt.
     *
     */
    public void empfange() {

        SpielObjekt objekt = null;
        try {
            while ((objekt = (SpielObjekt) input.readObject()) != null) {
                if (objekt.getNachricht().length() > 5 && objekt.getNachricht().substring(0, 6).equals("C_NAME")) {

                    int subNumber = Integer.parseInt(objekt.getNachricht().substring(6, 7));

                    System.out.println("C_NAME erhalten");
                    this.setClientName(subNumber);
                    fenster = new SpielerFenster(subNumber, this);
                    if (subNumber > 2) {
                        fenster.dispose();
                        fenster = null;
                    }
                    System.out.println("Clientname gesetzt: " + this.clientName);
                } else if (objekt.getNachricht().equals("VERTEILE_KARTEN")) {
                    System.out.println("Client: Kartendeck erhalten. Sende jetzt an SpielerFenster...");
                    fenster.zeigeKartenAn(objekt);
                } else if (objekt.getNachricht().equals("SPIELZUG GUELTIG")) {
                    fenster.erhalteSpielstatus(objekt);
                } else if (objekt.getNachricht().equals("SPIELZUG_UNGUELTIG")) {
                    fenster.erhalteSpielinfo(objekt);
                } else if (objekt.getNachricht().equals("SENDE_PUNKTE")) {
                    fenster.zeigePunktestandAn(objekt);
                } else if (objekt.getNachricht().equals("VERLANGE_KARTEN")) {
                    fenster.sendeHandkarten(objekt);
                } else if (objekt.getNachricht().equals("WARTE")) {
                    fenster.erhalteSpielinfo(objekt);
                } else if (objekt.getNachricht().equals("VERBUNDEN")) {
                    fenster.erhalteSpielinfo(objekt);
                } else if (objekt.getNachricht().equals("VERBINDUNG_UNTERBROCHEN")) {
                    fenster.erhalteSpielinfo(objekt);
                }
                System.out.println("Client: Nachricht von Objekt erhalten: " + objekt.getNachricht());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(SpielClient.class.getName()).log(Level.SEVERE, null, ex);
                }
                output.reset();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
            Logger.getLogger(SpielClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
            Logger.getLogger(SpielClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Diese Methode übermittelt Objekte der Klasse SpielObjekt über den
     * ObjectOutputStream. Die Objekte werden in die Klasse SpielServerThread
     * übermittelt.
     *
     * @param objekt Das zu übertragende Objekt
     */
    public void sende(SpielObjekt objekt) {
        try {
            System.out.println("Client: Sende von Spielfenster :" + objekt.getVon() + "" + objekt.getNachricht());
            output.writeObject(objekt);
            output.flush();
        } catch (IOException iOException) {
            iOException.printStackTrace();
        }
    }

    /**
     * Instanziert Socket, ObjectOutputStream und ObjectInputStream.
     */
    private void inOut() {
        try {
            socket = new Socket("localhost", SpielServerThread.PORT);
            output = new ObjectOutputStream(socket.getOutputStream());
            input = new ObjectInputStream(socket.getInputStream());
        } catch (IOException iOException) {
            iOException.printStackTrace();
        }
    }

    /**
     * Konstruktor der Klasse SpielClient. Erzeugt eine neue Instanz der Klasse
     * SpielClient.
     */
    public SpielClient() {
        inOut();
        empfange();
    }

}
